public class Test {
    //标识符 字面常量 数据类型 变量 类型转换 类型提升 字符串类型
    public static void main(String[] args) {
        String s1="hi";
        System.out.println(s1);//hi
        int a=10,b=20;
        //当一个String字符串类型与整型相加时会将整型转化成字符串来处理
        System.out.println("a="+a+" b="+b);//a=10 b=20
        System.out.println(""+a+b);//1020
        System.out.println("a+b="+(a+b));//a+b=30
        System.out.println(a+b+"hi");//30hi 先数值计算再字符串
        //s1=(String) a;//报错
        //正确写法
        s1=String.valueOf(a);//a=10
        System.out.println("a="+s1);
        s1="123456";
        //将一个字符串转化为整型
        a=Integer.valueOf(s1);
        b=Integer.parseInt(s1);
        System.out.println("a="+a+" b="+b);//a=123456 b=123456
    }

    public static void main7(String[] args) {
        //java中有强制类型转换(显示)和自动类型转换(隐式)
        //强制类型转换形如：
        int a;
        double d=3.12334;
        a=(int)d;//显示
        System.out.println(a);
        d=a;//隐式
        System.out.println(d);
        long L=a;//隐式
        //a=L;//报错

        //通常来说，数值类型之间可以用显示类型转换
        //将表示范围小的赋值给表示范围大的会进行隐式类型转换
        //不相干的数据类型间不可以进行显示类型转换(隐式更不会发生)
        boolean bool=false;
        //a=bool;//报错
        a=0;
        //bool=a;//报错
        //bool=(boolean) a;//报错

        byte b1=1,b2=2;
        //b2=b1+b2;//报错 原因是会进行类型提升
        //正确写法
        b2=(byte)(b1+b2);
        short sh1=1,sh2=3;
        //sh2=sh1+sh2;//报错 原因是会进行类型提升
        //正确写法
        sh1=(short)(sh1+sh2);
        //低于4字节的整型类型会转换为int
        //类型提升类似于C语言
        char ch='邓';
        a=ch;//会进行隐式转换
        System.out.println(a);
    }
    public static void main6(String[] args) {
        //java没有明确规定boolean的内存大小
        boolean b=true;
        System.out.println(b);
        b=false;
        System.out.println(b);
        //b=1;//报错 java中的布尔类型只能赋值为true或false
    }

    public static void main5(String[] args) {
        //java用的是Unicode字符集
        //用两个字节来存储字符且没有符号位之说(0-65535)
        char ch='雙';//可以用来存储汉字或其他符号
        System.out.println(ch);
        char ch2=97;//也看用ascii码值来进行赋值
        System.out.println(ch2);
        //输出为可表示的最大字符(不一定可打印或可见)
        //System.out.println(Character.MAX_VALUE);
        //System.out.println(Character.MIN_VALUE);

        System.out.println((int)Character.MAX_VALUE);
        System.out.println((int)Character.MIN_VALUE);
    }

    public static void main4(String[] args) {
        int a=1;
        int b=2;
        System.out.println(a/b);//输出0 整型/整型 结果还是整型
        //要想输出小数可以进行如下操作
        System.out.println(1.0*a/b);

        double d1=1.1;
        System.out.println(d1*d1);//输出1.2100000000000002 精度问题
    }

    public static void main3(String[] args) {
        /*
         * java的数据类型有两大类：基本数据类型和引用数据类型
         * 基本数据类型包括：整型、浮点型、字符型、布尔型
         * java中的数据类型所占的内存容量大小是不受计算机的系统环境所影响的
         * 整型：byte(字节型,1字节) short(2字节) int(4字节) long(8字节)
         * 浮点型：float(4字节) double(8字节)
         * 字符型：char(2字节)
         * 布尔型：boolean(没有明确规定内存大小,true false)
         * Byte.MAX_VALUE: 127
         * Byte.MIN_VALUE: -128
         * Short.MAX_VALUE: 32767
         * Short.MIN_VALUE: -32768
         * Integer.MAX_VALUE: 2147483647
         * Integer.MIN_VALUE: -2147483648
         * Long.MAX_VALUE: 9223372036854775807
         * Long.MIN_VALUE: -9223372036854775808
         */

        //输出各个整型数据类型所能表示的数据范围
        System.out.print("Byte.MAX_VALUE: ");//Byte为byte的包装类型
        System.out.println(Byte.MAX_VALUE);
        System.out.print("Byte.MIN_VALUE: ");
        System.out.println(Byte.MIN_VALUE);

        System.out.print("Short.MAX_VALUE: ");
        System.out.println(Short.MAX_VALUE);
        System.out.print("Short.MIN_VALUE: ");
        System.out.println(Short.MIN_VALUE);

        //输出int能表示的最大值 (2^31)-1 (第一位为符号位)
        System.out.print("Integer.MAX_VALUE: ");
        System.out.println(Integer.MAX_VALUE);
        //输出int能表示的最小值 2^31
        System.out.print("Integer.MIN_VALUE: ");
        System.out.println(Integer.MIN_VALUE);

        System.out.print("Long.MAX_VALUE: ");
        System.out.println(Long.MAX_VALUE);
        System.out.print("Long.MIN_VALUE: ");
        System.out.println(Long.MIN_VALUE);

        System.out.print("Float.MAX_VALUE: ");
        System.out.println(Float.MAX_VALUE);
        System.out.print("Float.MIN_VALUE: ");
        System.out.println(Float.MIN_VALUE);

        System.out.print("Double.MAX_VALUE: ");
        System.out.println(Double.MAX_VALUE);
        System.out.print("Double.MIN_VALUE: ");
        System.out.println(Double.MIN_VALUE);
    }

    public static void main2(String[] args) {
        //带换行的输出
        System.out.println("Hello world");
        System.out.println("10");
        System.out.println("3.14");
        //格式控制的输出
        System.out.printf("%s %d RMB\n","one dollar is about",7);
        //不带换行的输出
        System.out.print(3.333);
        System.out.print("换行了吗");
    }

    public static void main1(String[] args){
        //java的标识符由字母数字下划线和美元符构成
        int a=10;
        //int 3a;//不能以数字开头
        int ____=100;//合法但不合理
        int $=1;
        int main=666;
        System.out.println(____);
        System.out.println(a);
        System.out.println($);
        System.out.println(main);
        //标识符命名规范可参考《阿里巴巴java开发手册嵩山版》
    }
}
